#pragma once

#include <iostream>
#include <ostream>
#include <string>

namespace Arm {
    struct Printable {
        virtual void GenAsm(std::ostream& os) const = 0;
        void Print() const { GenAsm(std::cout); }

        template <class T>
        T* As() {
            return dynamic_cast<T*>(this);
        }
    };
}  // namespace Arm
